package aes.client;

import java.io.IOException;
import java.util.ArrayList;

import ocsf.client.AbstractClient;
import aes.general.AdminControl;
import aes.general.GuiControlBeta;
import aes.general.Msg;
import aes.general.QuestionControl;
import aes.general.StudentControl;
import aes.general.TeacherControl;

/**
 * This class overrides some of the methods defined in the abstract superclass
 * in order to give more functionality to the client.
 * 
 */
public class AesClient extends AbstractClient {
	// Instance variables **********************************************

	/**
	 * The interface type variable. It allows the implementation of the display
	 * method in the client.
	 */

	// Constructors ****************************************************

	/**
	 * Constructs an instance of the chat client.
	 * 
	 * @param host
	 *            The server to connect to.
	 * @param port
	 *            The port number to connect on.
	 * @param clientUI
	 *            The interface type variable.
	 */

	public AesClient(String host, int port) throws IOException {
		super(host, port); // Call the superclass constructor

		openConnection();
	}

	// Instance methods ************************************************

	/**
	 * This method handles all data that comes in from the server.
	 * 
	 * @param msg
	 *            The message from the server.
	 */
	@SuppressWarnings("unchecked")
	public void handleMessageFromServer(Object msg) {

		if (((Msg) msg).getRequestType().equals("100"))
			GuiControlBeta.ProcessLoginQuery(msg);

		/**
		 * Student's replies from server.
		 */

		else if (((Msg) msg).getRequestType().equals("202"))
			StudentControl.GetExam(msg);
		
		else if (((Msg) msg).getRequestType().equals("203"))
			StudentControl.GetExamManual(msg);
		else if (((Msg) msg).getRequestType().equals("205"))
			StudentControl.StudentGradesRequest(msg);
		
		else if (((Msg) msg).getRequestType().equals("207"))
			StudentControl.RunExamAutomatic(msg);
		
		else if (((Msg) msg).getRequestType().equals("209"))
			StudentControl.RunGetmanualExamslist(msg);
		
		else if (((Msg) msg).getRequestType().equals("210"))
			StudentControl.PutFinishedExamInfo(msg);
		
		else if (((Msg) msg).getRequestType().equals("211"))
			StudentControl.getDownoadManualExamCopy(msg);

		/**
		 * Teacher's replies from server.
		 */
		else if (((Msg) msg).getRequestType().equals("400"))
			 QuestionControl.QuestionRequestfromClient(msg);

		else if (((Msg) msg).getRequestType().equals("401"))
			 TeacherControl.RecieveCourses(msg);
		
		else if (((Msg) msg).getRequestType().equals("402"))
			 TeacherControl.RecieveQuestions(msg);
		
		else if (((Msg) msg).getRequestType().equals("403"))
			 TeacherControl.ExamIdError(msg);
		
		else if (((Msg) msg).getRequestType().equals("404"))
			 TeacherControl.SetActExam(msg);
		
		else if (((Msg) msg).getRequestType().equals("406"))
			 TeacherControl.SetStatExamInfo(msg);
		
		else if(((Msg) msg).getRequestType().equals("405"))
			 TeacherControl.ActivationAnswer(msg);


		else if (((Msg) msg).getRequestType().equals("408"))
			 TeacherControl.SetActivatedExams(msg);
		
		else if (((Msg) msg).getRequestType().equals("410"))
			 TeacherControl.SetNotApprovedExams(msg);
		
		else if (((Msg) msg).getRequestType().equals("411"))
			 TeacherControl.SetNotApprovedinfo(msg);
		
		 else if (((Msg) msg).getRequestType().equals("413"))
             TeacherControl.SetQId(msg);
		
		 else if (((Msg) msg).getRequestType().equals("416"))
             StudentControl.RunLockExam(msg);
		
		 else if (((Msg) msg).getRequestType().equals("421"))
             TeacherControl.setingsGradesStats(msg);
		
		 else if (((Msg) msg).getRequestType().equals("418"))
             TeacherControl.setExamInfoteacher(msg);
		
		/**
		 * Admin's replies from server.
		 */
		
		else if (((Msg) msg).getRequestType().equals("300"))
			 AdminControl.setRequests(msg);
		
		else if (((Msg) msg).getRequestType().equals("304"))
			 AdminControl.setExamVector(msg);
		
		else if (((Msg) msg).getRequestType().equals("305"))
			 AdminControl.setQuestionArray(msg);
		
		else if (((Msg) msg).getRequestType().equals("306"))
			 StudentControl.RunExtendExamTime(msg);

		
		else if (((Msg) msg).getRequestType().equals("307"))
			 AdminControl.runSetCourseID(msg);	
		

		
		else if (((Msg) msg).getRequestType().equals("320"))
			 AdminControl.SetVectorUserInfo(msg);
	
		
		else if (((Msg) msg).getRequestType().equals("321"))
			 AdminControl.setingsGradesStats(msg);
			
		else if (((Msg) msg).getRequestType().equals("323"))
			 AdminControl.setingsExameIdStats(msg);
		
		
	}

	/**
	 * This method handles all data coming from the UI
	 * 
	 * @param message
	 *            The message from the UI.
	 */
	public void handleMessageFromClientUI(Object message) {
		try {
			sendToServer(message);
		} catch (IOException e) {
			System.out
					.println("Could not send message to server.  Terminating client.");
			quit();
		}
	}

	/**
	 * This method terminates the client.
	 */
	public void quit() {
		try {
			closeConnection();
		} catch (IOException e) {
		}
		System.exit(0);
	}
}
// End of ChatClient class
